package com.dengyuanke.lambda;

import com.dengyuanke.entity.Employee;
import org.junit.Test;

import java.util.Arrays;
import java.util.Collections;
import java.util.List;

public class Lambda {
    List<Employee> emps = Arrays.asList(
            new Employee(101, "张三", 18, 9999.99),
            new Employee(102, "李四", 59, 6666.66),
            new Employee(103, "王五", 28, 3333.33),
            new Employee(104, "赵六", 18, 7777.77),
            new Employee(105, "田七", 38, 5555.55)
    );

    /**
     * 调用Collections.sort()方法，通过定制排序比较两个Employee（先按年龄比，年龄相同按姓名比），
     * 使用Lambda作为参数传递
     */
    @Test
    public void test1(){
        Collections.sort(emps,(e1,e2)->{
            if(e1.getAge()==e2.getAge()){
                return e1.getName().compareTo(e2.getName());
            }else {
                return Integer.compare(e1.getAge(),e2.getAge());
            }
        });
        for (Employee emp : emps) {
            System.out.println(emp);
        }
    }
    /**
     * 1丶声明函数式接口，接口中声名抽象方法，public String getValue(String str);
     * 2丶在类中编写方法使用接口作为参数，将一个字符串装换为大写，并作为方法的返回值
     * 3丶再将一个字符串的第2个和第4个索引位置进行截取子串
     */
    @Test
    public void test2(){
        String str="abcdefg";
        String s = strHandler(str, str1 -> str.toUpperCase());
        System.out.println(s);
    }

    public String strHandler(String str,MyFunction myFunction){
        return myFunction.getValue(str);
    }
    /**
     * 1丶声明一个带两个泛型的函数式接口，泛型类型为<T,R> T为参数，R为返回值
     * 2丶接口中声明对应抽象方法
     * 3丶在类中声明方法，使用接口作为参数，计算两个long型参数的和
     * 4丶再计算两个long型参数的乘积
     */
    @Test
    public void test3(){
        //long型参数的和
        longHandler(100L,100L,(x,y)->x+y);
        //long型参数的乘积
        longHandler(100L,100L,(x,y)->x*y);
    }
    public void longHandler(Long l1,Long l2,MyFunction2<Long,Long> myFunction){
        System.out.println(myFunction.getValue(l1,l2));
    }
}

